import Vue from "vue";
import axios from "axios";
import router from "@/router";
import qs from "qs";
import merge from "lodash/merge";
// import baseURL from '@/config'

let proEnv = require("@/config/pro.env"); // 生产环境
let testEnv = require("@/config/test.env"); // 测试环境
let devEnv = require("@/config/dev.env"); // 本地环境

const env = process.env.NODE_ENV; //当前环境
let baseURL = ""; //路径
let uploadUrl = ""; //路径

if (env === "production") {
  // 生产环境
  console.log("生产环境");
  baseURL = proEnv.BASE_URL;
  uploadUrl = proEnv.UPLOAD_URL;
} else if (env === "test") {
  // 测试环境
  console.log("测试环境");
  baseURL = testEnv.BASE_URL;
  uploadUrl = testEnv.UPLOAD_URL;
} else {
  // 开发环境
  console.log("开发环境");
  baseURL = devEnv.BASE_URL;
  uploadUrl = devEnv.UPLOAD_URL;
}

const http = axios.create({
  timeout: 1000 * 30,
  withCredentials: true,
  headers: {
    "Content-Type": "application/json; charset=utf-8",
  },
});

/**
 * 请求拦截
 */
http.interceptors.request.use(
  (config) => {
    config.headers["Token"] = Vue.$cookies.get("token"); // 请求头带上token
    // config.headers['Content-Type'] = 'multipart/form-data' // 请求头带上token
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 响应拦截
 */
http.interceptors.response.use(
  (response) => {
    if (response.data && response.data.code === 401) {
      // 401, token失效
      router.push({ name: "login" });
    } else {
      if (response.headers.token != null && response.headers.token != "null") {
        Vue.$cookies.set("token", response.headers.token);
      }
    }
    return response;
  },
  (error) => {
    return Promise.reject(error);
  }
);

/**
 * 请求地址处理
 * @param {*} actionName action方法名称
 */
http.url = (actionName) => {
  // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  // return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : baseURL) + actionName
  return baseURL + actionName;
};

/**
 * 第三方接口请求地址
 * @param {*} actionName action方法名称
 */
http.adornOtherUrl = (actionName) => {
  // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  return (
    (process.env.NODE_ENV !== "production" && process.env.OPEN_PROXY
      ? "/thirdpartyProxy"
      : window.SITE_CONFIG.otherUrl) + actionName
  );
};

/**
 * 图片上传请求地址
 * @param {*} actionName action方法名称
 */
http.adornImgUploadUrl = (actionName) => {
  // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
  return (
    (process.env.NODE_ENV !== "production" && process.env.OPEN_PROXY
      ? "/imgUploadProxy"
      : window.SITE_CONFIG.otherUrl) + actionName
  );
};

/**
 * get请求参数处理
 * @param {*} params 参数对象
 * @param {*} openDefultParams 是否开启默认参数?
 */
http.params = (params = {}, openDefultParams = true) => {
  var defaults = {
    t: new Date().getTime(),
  };
  return openDefultParams ? merge(defaults, params) : params;
};

/**
 * post请求数据处理
 * @param {*} data 数据对象
 * @param {*} openDefultdata 是否开启默认数据?
 * @param {*} contentType 数据格式
 *  json: 'application/json; charset=utf-8'
 *  form: 'application/x-www-form-urlencoded; charset=utf-8'
 */
http.data = (data = {}, openDefultdata = true, contentType = "json") => {
  var defaults = {
    t: new Date().getTime(),
  };
  data = openDefultdata ? merge(defaults, data) : data;
  return contentType === "json" ? JSON.stringify(data) : qs.stringify(data);
};

/**
 * 表单参数
 * @param {*} name 表单数据name
 * @param {*} data 表单数据的值
 *  json: 'application/json; charset=utf-8'
 *  form: 'application/x-www-form-urlencoded; charset=utf-8'
 */
http.turnToFormData = (name, data) => {
  let forms = new FormData();
  forms.append(name, data);
  return forms;
};

/**
 * 多表单参数
 * @param {*} obj 表单数据
 * @param {*} data 表单数据的值
 *  json: 'application/json; charset=utf-8'
 *  form: 'application/x-www-form-urlencoded; charset=utf-8'
 */
http.turnToFormDatas = (obj) => {
  let forms = new FormData();
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (obj[key] == null || obj[key] == undefined) {
        forms.append(key.toString(), "");
      } else {
        forms.append(key.toString(), obj[key]);
      }
    }
  }
  return forms;
};

export default http;
